<?php

require_once 'Zend/Soap/Server.php';
require_once 'XML/xmlToObjArray.php';
require_once './application/models/Tables/cache.php';
require_once './application/core/Detail/detailCore.php';
require_once './application/core/Config/backupCore.php';

// Fonction que le client perl peut appeler
function ValideIp()
{

}

function DecouverteComposant()
{

}

function LiensComposant()
{

}

function LogComposant()
{

}

function BackupComposant()
{

}

function RestoreComposant()
{

}

function DetailComposant()
{

}

function CommandComposant()
{

}

function ConfigSonde()
{

}

class ServerSOAP extends CoreBase
{

    private $_options;
    private $_function;
    private $_server;
    private $_data;
    private $_header;
    private $_body;
    private $_idClient;
    private $_serviceResp;
    private $_obj;

    public function __construct(&$controller)
    {
        parent::__construct($controller);
        $this->_options = array('encoding' => 'UTF-8', 'uri' => 'urn://ADN-URI/');
        $this->_function = array('ValideIp',
            'DecouverteComposant',
            'LiensComposant',
            'LogComposant',
            'BackupComposant',
            'RestoreComposant',
            'DetailComposant',
            'CommandComposant',
            'ConfigSonde');
    }

    public function Execute()
    {
        try
        {
// Capture de la sortie
            ob_start();
// Initialisation du server SOAP
            $this->_server = new Zend_Soap_Server(null, $this->_options);
// Mettre les fonctions que le server doit recup
            $this->_server->addFunction($this->_function);
// Ne pas repondre au client
            $this->_server->setReturnResponse(true);
// Capturer l'entr�e et le mettre les donn�es dans une variable
            $this->_data = file_get_contents('php://input');
// Lancement du server SOAP
            $this->_server->handle();
            $this->Parse();
            $this->Debug();
        } catch (Zend_Exception $e)
        {
            echo get_class($e);
            echo $e->getMessage();
        }
    }

// Traitement des donnes recus ($this->_data)
    private function Parse()
    {
        $this->_data = preg_replace('/\n/i', '', $this->_data);
// Parse Body / Header
        $this->_header = preg_replace('/.*(\<)soap\:(Header\>)(.*)(\<\/)soap\:(Header\>).*/i', '$1$2$3$4$5', $this->_data);
        $this->_body = preg_replace('/^.*Body\>[\ ]*\<[^\>]+\>[\ ]*(.*)[\ ]*\<[^\>]+\>[\ ]*\<\/soap\:Body.*$/i', '$1', $this->_data);
        if ($this->_body == '')
            $this->_body = null;
        if ($this->_header == '')
            $this->_header = null;
        if (isset($this->_header))
        {
// Mettre les donn�es entre les balises "Header" dans un objet
            $xml = new xmlToObjArray();
            $this->_header = $xml->parse_xml_data($this->_header, true);
// Identifiant de ce client
            if (isset($this->_header->{0}->{'HEADER'}->{0}->{'IDCLIENT'}->{0}->{0}))
                $this->_idClient = $this->_header->{0}->{'HEADER'}->{0}->{'IDCLIENT'}->{0}->{0};
// Nom de la methode a rappeler
            if (isset($this->_header->{0}->{'HEADER'}->{0}->{'PFCT'}->{0}->{0}))
                $this->_serviceResp = $this->_header->{0}->{'HEADER'}->{0}->{'PFCT'}->{0}->{0};
// S'il y a bien des informations alors on va mettre les donn�es dans la bdd
            if (isset($this->_idClient) && isset($this->_serviceResp) && isset($this->_body))
            {
                switch ($this->_serviceResp)
                {
                    case 'detailipresp' : $this->putInDetail();
                        break;
                    case 'backupresp' : $this->putInBackup();
                        break;
                    default : $this->putInCache();
                        break;
                }
            }
        }
    }

    private function putInCache()
    {
        $this->_obj = new cache();
        $this->_obj->writeInfo($this->_idClient, $this->_serviceResp, $this->_body);
        return;
    }

    private function putInDetail()
    {
        $this->_obj = new detailCore($this->_controller);
        $this->_obj->detailIpResp($this->_body);
        return;
    }

    private function putInBackup()
    {
        $this->_obj = new backupCore($this->_controller);
        $this->_obj->backupResp($this->_body, $this->_idClient);
        return;
    }

// Debug : Sortie dans un fichier
    private function Debug()
    {
        /* //var_dump( $this->_body );
          $xml = new xmlToObjArray();
          $xml = $xml->parse_xml_data( $this->_body, false );
          var_dump( $xml[0]['PARAM'][0]['BACKUP'][0]['DATA'][0] );
          var_dump( $xml );
          // Mettre la sortie dans une variable
          $tab_debug = ob_get_contents();
          // Clean la sortie
          ob_end_clean();
          // Ecrire ds un fichier
          $monfichier = fopen( 'sortieduserver.txt', 'w+' );
          fwrite( $monfichier, $tab_debug );
          fclose( $monfichier );
          unset( $monfichier );
          unset( $tab_debug ); */
    }

}
